{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{None: 3903, 'O=CNNO': 1018, 'NNC=O': 54, 'O=c1[nH][nH]o1': 185, 'NNNC=O': 392, 'O=CNCO': 28, 'NNONNC=O': 273, 'NC=O': 175, 'O=C/N=N\\\\O': 151, 'O=CNN=O': 143, 'O=CNNN=O': 1, 'N/N=N\\\\N=N/C=O': 1, 'O=C1N=NN1': 29, 'CN(N)NNC=O': 5, 'NNOCNC=O': 7, 'O=CNOO': 177, 'NNN/N=N\\\\C=O': 13, 'O=c1[nH]oo1': 45, 'NNNN1NC1=O': 19, 'NNCNNC=O': 7, 'NNOONC=O': 48, 'NO/N=N\\\\NC=O': 3, 'NONN(N)C=O': 278, 'NNN(C=O)NN': 15, 'NNNNNC=O': 109, 'NCn1[nH][nH]c1=O': 10, 'CONNC(N)=O': 9, 'NN(C=O)OOO': 12, 'NNNN(O)C=O': 9, 'NN(C=O)NNO': 20, 'N=NNN(N)C=O': 11, 'N/N=N\\\\N(N)C=O': 11, 'Nn1[nH][nH]c1=O': 4, 'NCN(C=O)N=O': 5, 'COON(N)C=O': 26, 'CON(C=O)NO': 1, 'NOC(=O)N(N)N': 33, 'NNO/N=N\\\\C=O': 31, 'NCNNNC=O': 44, 'CONN(N)C=O': 99, 'O=c1[nH][nH][nH]1': 87, 'O=C1NCO1': 10, 'NN(C=O)NOO': 50, 'CNNN(N)C=O': 47, 'O=c1[nH]o[nH]1': 13, 'NCNC=O': 18, 'N[N@@+]([O-])(C=O)NO': 8, 'O=C1N=NO1': 21, 'NN(N)C(=O)OO': 7, 'NN(N)C(=O)NO': 4, 'CNNN(O)C=O': 2, 'NOn1[nH][nH]c1=O': 7, 'NNON(N)C=O': 32, 'NCONNC=O': 94, 'N=NC=O': 8, 'NONN1NC1=O': 39, 'COON1NC1=O': 4, 'NNC(N)=O': 42, 'NONC(=O)NO': 1, 'NCNONC=O': 7, 'NOn1[nH]oc1=O': 4, 'O=CNNNOO': 2, 'NONC=O': 81, 'NNC(=O)O': 117, 'Nc1nn2c(=O)n12': 1, 'CNNC=O': 47, 'CC(=O)N1NON1': 1, 'N=NC(=O)O': 12, 'NNn1[nH][nH]c1=O': 30, 'O=CNNONO': 11, 'O=C(O)NO': 20, 'NON(C=O)NO': 7, 'COONC=O': 4, 'NNNN(N)C=O': 119, 'N/N=N\\\\C=O': 74, 'NOCNC(N)=O': 1, 'NNn1[nH]oc1=O': 14, 'O=CNNNNO': 5, 'O=C1NN1NNO': 5, 'NCCNNC=O': 6, 'NNN(C=O)NO': 50, 'CN(C=O)NON': 19, 'Nn1on(N)c1=O': 2, 'NONNC=O': 27, 'O=C1NN1NOO': 9, 'NNNC(=O)NN': 9, 'O=CNO': 5, 'NN1NN(C=O)N1': 11, 'C=C=NN(N)C=O': 1, 'NC(=O)NO': 14, 'NCN(C=O)NO': 15, 'NNN1C(=O)[C@@H]1N': 1, 'NCN(C=O)NN': 4, 'N=NONNC=O': 2, 'NN/N=N\\\\C(N)=O': 4, 'NONN(O)C=O': 12, 'NONNC(N)=O': 47, 'CN(OO)C(N)=O': 1, 'NCO/N=N\\\\C=O': 15, 'NN1NC1=O': 1, 'NOON(N)C=O': 50, 'N[C@H]1ON(N)C1=O': 2, 'NNNONC=O': 16, 'NN1ONN1C=O': 26, 'C/N=N\\\\NC=O': 2, 'NCOONC=O': 19, 'Nn1on1NC=O': 4, 'NOONNC=O': 47, 'CN(C=O)NC=O': 1, 'CNC(=O)O': 3, 'NC(=O)N1NNN1': 2, 'NN(N)NNC=O': 10, 'NN[C@@H]1NNC1=O': 2, 'CONNC=O': 11, 'NN1N[C@@H](O)C1=O': 1, 'N=NNC=O': 60, 'Nn1n(O)n1C=O': 2, 'NCN(C=O)OO': 3, 'NN(O)N(N)C=O': 5, 'N=NC(=O)ONN': 5, 'NNN1C(=O)N1N': 1, 'NNN1NCC1=O': 2, 'CN(O)C(=O)ON': 1, 'O=CN(NO)NO': 3, 'NNn1o[nH]c1=O': 4, 'NCn1[nH]oc1=O': 3, 'COONC(N)=O': 2, 'NOO/N=N\\\\C=O': 8, 'O=CN(O)NOO': 1, 'NCNN(N)C=O': 7, 'O=C[N@@+]1([O-])NON1': 4, 'NOCNC=O': 4, 'NC(=O)NOOO': 2, 'Cn1[nH]n(O)c1=O': 2, 'O=CNNOO': 9, 'NNNNC(N)=O': 12, 'NN1CN(N)C1=O': 2, '[N-]=[N+]=NN(N)C=O': 1, 'NN1N=C(O)C1=O': 1, 'NN(O)C(=O)OO': 2, 'O=CNNCCO': 1, 'CC(=O)NN': 3, 'NOC(=O)N(N)O': 7, 'CONC=O': 14, 'O=CNOONO': 2, 'NOOONC=O': 9, 'N/C=N\\\\NNC=O': 4, 'NN/N=N\\\\NC=O': 11, 'CNNNC=O': 3, 'NNC(=O)N(N)N': 10, 'CNON(N)C=O': 7, 'NN1OON1C=O': 1, 'NNOC(=O)NN': 21, 'N=NN(N)C(N)=O': 1, 'NCn1ooc1=O': 3, 'NNC(=O)NNO': 1, 'O=C1CNN1': 9, 'N[C@@H]1NCN1C=O': 1, 'NNN(C=O)ON': 6, 'NN(C=O)[N@]1CO1': 2, 'NOCN(N)C=O': 15, 'NNN1N=NC1=O': 2, 'COC(=O)N(N)N': 10, 'O=CNOOO': 3, 'NN(N)N(N)C=O': 3, 'CN(N=O)C(N)=O': 1, 'O=CNNOOO': 2, 'CNNN1NC1=O': 10, 'O=c1[nH]on[n+]1[O-]': 1, 'NC(=O)N1NNO1': 1, 'CCONNC=O': 3, '[N-]=[N+]1NN(N)C1=O': 2, 'CNNNNC=O': 5, 'NN[N@+](N)([O-])C=O': 3, 'CNNN(C)C=O': 2, 'N[C@@H]1NN(C=O)N1': 1, 'O=CN1NON1': 5, 'CN1NNNC1=O': 1, 'O=Cn1[nH]o1': 3, 'Cn1on(N)c1=O': 2, 'O=CN/N=N\\\\NO': 1, 'Nn1[nH]n(N)c1=O': 21, 'CCON(N)C=O': 1, 'NNNNC=O': 3, 'CNN(N)C(=O)O': 1, 'N=NC(=O)OON': 2, 'NNCC(=O)NN': 2, 'NC(=O)NNCO': 1, 'NC/N=N\\\\NC=O': 7, 'NONNNC=O': 16, 'NOON(O)C=O': 3, 'NON(C=O)N=O': 2, 'C/N=N\\\\N(N)C=O': 9, 'NN/N=N\\\\C=O': 2, 'CCNNNC=O': 1, 'N[C@@H]1NONC1=O': 1, 'NNC(=O)N(N)O': 8, 'NNON(O)C=O': 2, 'CONN1OC1=O': 2, 'NN1NNNC1=O': 3, 'NNN(N)C(=O)O': 7, 'N=NC(N)=O': 6, 'NCN(N)NC=O': 1, 'NNC(=O)ONO': 3, 'CNNNC(N)=O': 2, 'NC(=O)NNOO': 9, 'N=NC(=O)N(N)N': 3, 'NN(O)ONC=O': 2, 'N[C@H]1ONNC1=O': 2, 'NC(=O)NNNO': 5, 'NCOC(=O)NN': 6, 'NCn1[nH]c(=O)o1': 1, 'NN(C=O)n1[nH]o1': 2, 'CC(=O)N=O': 1, 'CNOONC=O': 4, 'Nn1nnoc1=O': 2, 'CN/N=N\\\\C=O': 1, 'CN1NN2C(=O)N12': 1, 'C[C@H](N)N1NC1=O': 1, 'COCN1NC1=O': 2, 'CN1NN(C=O)N1': 6, 'CNONNC=O': 15, 'NNN(C=O)OO': 7, 'NCN(C=O)ON': 3, 'O=C/N=C\\\\O': 5, 'CN(N)C(=O)NO': 1, '[N-]=[N+](N)C(=O)NN': 1, 'NCN(C=O)CN': 1, 'NC(=O)NNC=O': 1, 'NO/N=N\\\\C=O': 5, 'C=NNNC(C)=O': 1, 'O=CNONNO': 2, 'NN(C=O)/N=C\\\\O': 2, 'CONN(O)C=O': 2, 'NN/C=N\\\\NC=O': 4, 'O=NC(=O)O': 4, 'NN(C=O)/N=N\\\\O': 7, 'Nn1[nH]n(O)c1=O': 6, 'N/N=N/C(=O)NN': 1, 'NONONC=O': 7, 'CONN1NC1=O': 13, 'CN(N)C(=O)ON': 1, 'NNNNC(=O)O': 1, 'NN1NON1C=O': 5, 'N=NON(N)C=O': 2, 'N=NC(=O)NNN': 3, 'NN1NNN1C=O': 10, 'O=C1N=NONN1': 1, 'C/N=N\\\\N(O)C=O': 1, 'NNONC(N)=O': 2, 'NC(=O)n1nn[nH]1': 1, 'NNN(O)NC=O': 3, 'CC(=O)NNON': 4, 'NCN(O)NC=O': 2, 'CNN/C=N\\\\C=O': 1, 'CNC(=O)N(N)N': 5, 'NOONC=O': 4, 'CN(C=O)NOO': 3, 'CC(=O)[N@@+](N)(N)[O-]': 1, 'NCNC(=O)NO': 1, 'CNO/C=N\\\\C=O': 1, 'NC(=O)N1NON1': 3, 'N[C@H]1ONN1C=O': 11, 'Cn1[nH]n(N)c1=O': 7, '[N-]=[N+]=NC=O': 3, 'NN1NN(C=O)O1': 4, 'O=CN=O': 4, '[N-]=[N+](N)NNC=O': 2, 'COCNC=O': 2, 'CNCNNC=O': 1, 'Nc1n[nH]n1C=O': 2, 'NCN1CNC1=O': 1, 'CNNONC=O': 1, 'CN(C=O)NO': 2, 'Nn1n2[nH]n1c2=O': 1, 'NCN1N=NC1=O': 4, 'NN(C=O)NO': 2, 'N[C@H]1O[C@@H]1NC=O': 1, 'NC(=O)/N=N\\\\OO': 1, 'N/N=N\\\\NC=O': 1, 'NCNC(=O)NN': 3, 'CNN(C=O)NN': 4, 'N[C@@H]1NN(N)C1=O': 2, 'NN(C=O)ONO': 2, 'C=NNC=O': 4, 'NN1NONC1=O': 3, 'NC(=O)N1NOO1': 1, 'C/N=N\\\\C=O': 5, 'NONCNC=O': 2, 'N/C=N\\\\NC(N)=O': 1, 'CN(C=O)OO': 1, 'NCON(N)C=O': 3, 'COC(=O)NN': 1, 'NN(C=O)N(O)O': 2, 'N=CNC=O': 2, 'NC(=O)N(N)N=O': 1, 'NNOC(=O)N=O': 1, 'O=C1NNCNN1': 1, 'CC(=O)N1NNN1': 1, 'NNC(=O)OON': 3, 'CN(C=O)NNN': 4, 'O=CNONCO': 1, 'CNN(C=O)N=O': 1, 'NNN(N)C(N)=O': 4, 'O=CNn1on1O': 1, 'N/C=C\\\\NNC=O': 1, 'Cn1nnc(=O)[nH]1': 1, 'N[N@@+]([O-])(C=O)N=O': 1, 'NCN/N=N\\\\C=O': 4, 'NOON1NC1=O': 6, 'O=C1N[N@+]1([O-])NO': 1, 'NNN/C=N\\\\C=O': 1, 'N/N=N\\\\NNC=O': 6, 'NN1OONC1=O': 1, 'N=[N+]([O-])N1NC1=O': 1, 'N#CNN(N)C=O': 1, 'NNC(=O)NON': 2, 'CCNC=O': 2, 'CNC(=O)ONN': 2, 'NN/N=N/C(N)=O': 1, 'NOONC(N)=O': 6, 'NN1NNC(=O)N1': 3, 'O=CN1NN(O)N1': 3, 'NN(O)N(O)C=O': 2, 'CN(N)ONC=O': 3, 'NNCN(N)C=O': 2, '[N-]=[N+]1NN(C=O)N1': 1, 'NNN(C=O)N=O': 4, 'COC(=O)N(N)O': 1, 'NN1NCCC1=O': 1, 'COCN(N)C=O': 1, 'NNC(=O)ON': 4, 'O=CN(O)/N=N\\\\O': 1, 'NN(OO)C(=O)O': 1, 'NC(=O)N(N)OO': 2, 'Nn1[nH]c(=O)n1N': 3, 'NONN1OC1=O': 2, 'CONN(C)C=O': 6, 'CONNNC=O': 1, 'O=c1o[nH]n1NO': 1, 'O=C1NN[C@H]1O': 1, 'COONNC=O': 4, 'NC(=O)N(O)NO': 1, 'NC(=O)n1nc[nH]1': 1, 'N/C=N\\\\N(N)C=O': 2, 'O=CN1CONN1': 1, 'CN(C=O)OON': 3, 'NNN(O)C(=O)O': 2, 'N[C@]1(N)NNC1=O': 1, 'NN1NN2C(=O)N12': 2, 'NNN(O)C(N)=O': 3, 'N=NN(C=O)CN': 1, 'CCOONC=O': 2, 'N=C1NN(N)C1=O': 1, 'N=NC(=O)NCN': 2, 'O=CNCOO': 1, 'NO/N=N\\\\C(N)=O': 8, 'NN1CNN1C=O': 1, 'N/C(N)=N/NC=O': 1, 'O=CNNOCO': 4, 'NNCONC=O': 3, 'CNn1[nH][nH]c1=O': 1, 'CC(=O)/N=N\\\\ON': 1, 'NNN(N)NC=O': 1, 'CNC=O': 1, 'O=CN(CO)NO': 2, 'CN(NO)C(N)=O': 1, 'N[N@+]1([O-])NNC1=O': 2, 'NNC(=O)NN=O': 1, '[N-]=[N+]1ON(N)C1=O': 1, 'NC(=O)N(N)NO': 4, 'N[C@H]1OC(=O)N1N': 1, 'NN1ON(C=O)O1': 1, 'CCC(=O)N(N)O': 1, 'O=CNOOCO': 4, 'O=C1NN1/N=N\\\\O': 1, 'O=C1NCN1': 4, 'CN1NNOC1=O': 1, 'NNONC=O': 2, 'NN[C@@H]1N=NC1=O': 1, 'NN(C=O)OO': 1, 'NNN(C=O)CO': 1, 'CO/N=N\\\\C(N)=O': 1, 'NONNC(=O)O': 3, 'NCCC(=O)NO': 1, 'O=C/N=N\\\\ONO': 1, 'N[N@+]([O-])(C=O)OO': 1, 'O=CN(NO)OO': 1, 'O=NNC(=O)NO': 1, 'NN(N)ONC=O': 3, 'NC(=O)N(O)CO': 1, 'NNNN1CC1=O': 1, 'O=CNCOCO': 1, 'O=C1NN1CNO': 1, 'NN(C=O)NCO': 1, 'NON(O)NC=O': 1, 'CN(O)N(N)C=O': 2, 'O=CN1CON1': 3, 'C=NN(C=O)NN': 1, 'N[C@H]1n2[nH]c(=O)n21': 1, 'N[N@+]1([O-])NOC1=O': 1, 'NCN(N)C(=O)O': 1, 'NC[C@H]1NC(=O)O1': 1, 'C[C@H](N)N(N)C=O': 1, 'CNN(C=O)CN': 2, 'NC(=O)NN(N)O': 1, 'O=C1NN1OO': 1, 'Nn1n2oc(=O)n12': 2, 'NCN/C=N\\\\C=O': 1, 'N=NNN(O)C=O': 1, 'CCNN(N)C=O': 2, 'NOOC(=O)NO': 1, 'O=CN1CO1': 1, 'NC1=NN(N)C1=O': 1, 'N=NN(C=O)NN': 2, 'O=C/N=N\\\\OCO': 1, 'N=NNN1NC1=O': 1, 'O=CN1OON1O': 1, 'N[C@H]1OON1C=O': 1, 'O=C1N=CO1': 1, '[N-]=[N+](N)N1NC1=O': 1, 'NO[C@@H]1NNC1=O': 1, 'C/C(=N\\\\N)NC=O': 1, 'CNN(C=O)OO': 1, 'NNNCNC=O': 2, 'NCN(N)C(N)=O': 2, 'NN(NO)C(=O)O': 1, 'C=NON(N)C=O': 1, 'NON/N=N\\\\C=O': 1, 'N/N=N\\\\N1NC1=O': 1, 'CN(C=O)ONN': 1, 'NC(=O)N1CNN1': 1, 'N=Nn1[nH]oc1=O': 1, 'NC/C=N\\\\NC=O': 2, 'CNOC(=O)N=N': 1, 'CN1NNN1C=O': 1, 'CN(N)/N=N\\\\C=O': 2, 'NCC(=O)N(N)N': 1, 'NNNC(=O)NO': 2, 'NC/N=C\\\\NC=O': 1, 'NNON1NC1=O': 2, 'O=CN1NNN1': 1, 'NN(N)/N=N\\\\C=O': 2, 'O=C1N2N[N@@+]1([O-])N2': 1, 'NN(N)C(=O)O': 1, 'NCN(C=O)CO': 1, 'O=c1n2[nH]n1n2O': 1, 'NCOCNC=O': 2, 'CNC(=O)OCN': 1, 'O=CN1N[C@H](O)O1': 1, '[N-]=[N+]=NN(O)C=O': 1, 'CO/N=N\\\\C=O': 3, 'N[N@@+]1([O-])ONC1=O': 1, 'NN1CN(C=O)N1': 1, 'NON(C=O)OO': 3, 'O=C1CN1NOO': 1, 'Nn1c(=O)n2n1C2': 1, 'NNn1[nH]c(=O)o1': 1, 'O=C1NN1': 1, 'N=NNNC(N)=O': 1, 'Nn1nc[nH]c1=O': 1, 'NONN1CC1=O': 2, 'CC1=NN(N)C1=O': 1, 'N/N=N\\\\NC(N)=O': 1, 'CNN(C=O)NO': 1, 'CO/N=N\\\\C(=O)O': 1, 'NN1CCCC1=O': 1, 'CC(=O)N(N)NN': 1, 'NNC1=NNC1=O': 1, 'NNO/C=N\\\\C=O': 1, 'CNON1NC1=O': 1, 'Nn1oc(=O)n1N': 2, 'NOONC(=O)O': 1, 'NN(O)NNC=O': 2, 'O=c1o[nH]n1CO': 1, 'O=C1CON1': 2, 'O=CN1NNN1O': 1, 'CN(C=O)NNO': 1, 'O=CNC=O': 2, '[N-]=[N+]=NN1NC1=O': 1, 'CN(O)N1NC1=O': 1, 'NC1=CN(N)C1=O': 1, 'NOn1o[nH]c1=O': 1, 'CNCN(N)C=O': 1, 'NOCN(O)C=O': 1, 'O=CNNNCO': 1, 'NCCC(=O)NN': 1, 'CO/N=N\\\\C(C)=O': 1, 'CONN1CC1=O': 1, 'CNC(=O)N(N)O': 1, 'COC(=O)N(O)O': 1, 'NC(=O)N1CNC1': 1, 'N/N=[N+](\\\\[O-])NC=O': 1, 'N/N=N/C(=O)NO': 1, 'C[C@]12NN(N1)C2=O': 1, 'NN1ONNC1=O': 1, 'CNO/N=N\\\\C=O': 1, 'NON(N)C=O': 1, 'O=C/N=N\\\\NO': 1, 'NNC(=O)OO': 1, 'NN(CO)NC=O': 1, 'O=C1NN1O': 1, 'NNNN1OC1=O': 1, 'NN(O)/N=N\\\\C=O': 1, 'CN1[C@@H]2NN1C2=O': 1, 'NN1CN2C(=O)N12': 1, 'CN(NN)NC=O': 1, 'O=C1OCNN1O': 1, 'N[C@@H]1NNC1=O': 1, 'NCC(=O)NNO': 1, 'Nn1[nH]c(=O)n1O': 1, 'NC(=O)n1[nH]n1O': 1, 'NOCNNC=O': 1, 'CC(=O)N/N=N\\\\O': 1, 'C=NNN(N)C=O': 1, 'NOCN1NC1=O': 1, 'NCC(=O)N(N)O': 1, 'CCn1[nH][nH]c1=O': 1, 'NN1CC(=O)N1N': 1, 'O=C(O)NNNO': 1, 'CNC(N)=O': 2, 'O=CN(O)NNO': 1, 'CCNNC(N)=O': 1, 'NCONC(N)=O': 1, 'CC(=O)NONN': 1, 'CNCN1NC1=O': 1, 'N[C@H]1C(=O)n2[nH]n21': 1, 'C=C(N)/N=N\\\\C=O': 1, 'O=c1o[nH]n1OO': 1, 'N[C@@H]1N=NN1C=O': 1, 'NCNN(O)C=O': 1, 'CNN(O)NC=O': 1, 'O=CNNNO': 2, 'O=Cn1[nH][nH]1': 1, 'CCN/N=N\\\\C=O': 1, 'CNN(N)NC=O': 1, 'NON(N)C(N)=O': 1, 'O=C1C=NN1': 1, 'COON(C)C=O': 1, 'C=NC(N)=O': 1, 'C=NONC=O': 1, 'O=CNN/N=C\\\\O': 1, 'O=CN(CO)OO': 1, 'NON1N=NC1=O': 1, 'NCCONC=O': 1}\n",
      "Validity: 60.97%\n",
      "Diversity: 5.44%\n"
     ]
    }
   ],
   "source": [
    "import sys\n",
    "sys.path.append(\"../\")\n",
    "from qmg.generator import MoleculeGenerator\n",
    "from qmg.utils import ConditionalWeightsGenerator\n",
    "from rdkit import RDLogger\n",
    "RDLogger.DisableLog('rdApp.*')\n",
    "\n",
    "# parameter settings for epoxide derivatives\n",
    "num_heavy_atom = 7\n",
    "random_seed = 3\n",
    "smarts = \"[O:1]=[C:2][N:3]\"\n",
    "disable_connectivity_position = [1]\n",
    "num_sample = 10000\n",
    "\n",
    "cwg = ConditionalWeightsGenerator(num_heavy_atom, smarts=smarts, disable_connectivity_position=disable_connectivity_position)\n",
    "random_weight_vector = cwg.generate_conditional_random_weights(random_seed)\n",
    "mg = MoleculeGenerator(num_heavy_atom, all_weight_vector=random_weight_vector)\n",
    "smiles_dict, validity, diversity = mg.sample_molecule(num_sample)\n",
    "print(smiles_dict)\n",
    "print(\"Validity: {:.2f}%\".format(validity*100))\n",
    "print(\"Diversity: {:.2f}%\".format(diversity*100))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<pre style=\"word-wrap: normal;white-space: pre;background: #fff0;line-height: 1.1;font-family: &quot;Courier New&quot;,Courier,monospace\">      ┌────────────┐                                       ┌─┐                 »\n",
       "q6_0: ┤ Ry(2.6528) ├──■───────────────────────■────────────┤M├─────────────────»\n",
       "      └───┬───┬────┘┌─┴─┐               ┌─────┴──────┐     └╥┘              ┌─┐»\n",
       "q6_1: ────┤ X ├─────┤ X ├───────■───────┤ Ry(2.3812) ├──■───╫───────────────┤M├»\n",
       "      ┌───┴───┴────┐└───┘┌──────┴──────┐└────────────┘┌─┴─┐ ║               └╥┘»\n",
       "q6_2: ┤ Ry(1.3213) ├─────┤ Ry(0.81341) ├──────■───────┤ X ├─╫───────■────────╫─»\n",
       "      ├────────────┤     └─────────────┘    ┌─┴─┐     └───┘ ║ ┌─────┴──────┐ ║ »\n",
       "q6_3: ┤ Ry(1.6062) ├────────────────────────┤ X ├───────────╫─┤ Ry(1.2721) ├─╫─»\n",
       "      └────────────┘                        └───┘           ║ └────────────┘ ║ »\n",
       "q6_4: ──────────────────────────────────────────────────────╫────────────────╫─»\n",
       "                                                            ║                ║ »\n",
       "q6_5: ──────────────────────────────────────────────────────╫────────────────╫─»\n",
       "                                                            ║                ║ »\n",
       "q6_6: ──────────────────────────────────────────────────────╫────────────────╫─»\n",
       "                                                            ║                ║ »\n",
       "q6_7: ──────────────────────────────────────────────────────╫────────────────╫─»\n",
       "                                                            ║                ║ »\n",
       "c: 12/══════════════════════════════════════════════════════╩════════════════╩═»\n",
       "                                                            0                1 »\n",
       "«                                                                             »\n",
       "«q6_0: ───────────────────────────────────────────────────────────────────────»\n",
       "«                                                                             »\n",
       "«q6_1: ───────────────────────────────────────────────────────────────────────»\n",
       "«      ┌─┐                                                                    »\n",
       "«q6_2: ┤M├────────────────────────────────────────────────────────────────────»\n",
       "«      └╥┘┌─┐                                                                 »\n",
       "«q6_3: ─╫─┤M├─────────────────────────────────────────────────────────────────»\n",
       "«       ║ └╥┘┌────── ┌──────── ┌────────────┐                     ───────┐ ┌─┐»\n",
       "«q6_4: ─╫──╫─┤       ┤         ┤ Ry(2.4624) ├──■─────────■───────        ├─┤M├»\n",
       "«       ║  ║ │ If-0  │ Else-0  └───┬───┬────┘┌─┴─┐┌──────┴──────┐  End-0 │ └╥┘»\n",
       "«q6_5: ─╫──╫─┤       ┤         ────┤ X ├─────┤ X ├┤ Ry(0.95289) ├        ├──╫─»\n",
       "«       ║  ║ └──╥─── └────────     └───┘     └───┘└─────────────┘ ───────┘  ║ »\n",
       "«q6_6: ─╫──╫────╫───────────────────────────────────────────────────────────╫─»\n",
       "«       ║  ║    ║                                                           ║ »\n",
       "«q6_7: ─╫──╫────╫───────────────────────────────────────────────────────────╫─»\n",
       "«       ║  ║ ┌──╨──┐                                                        ║ »\n",
       "«c: 12/═╩══╩═╡ 0x0 ╞════════════════════════════════════════════════════════╩═»\n",
       "«       2  3 └─────┘                                                        4 »\n",
       "«                                                                             »\n",
       "«q6_0: ───────────────────────────────────────────────────────────────────────»\n",
       "«                                                                             »\n",
       "«q6_1: ───────────────────────────────────────────────────────────────────────»\n",
       "«           ┌──────  ┌───┐ ───────┐                                           »\n",
       "«q6_2: ─────┤ If-0  ─┤ X ├  End-0 ├───────────────────────────────────────────»\n",
       "«           └──╥───  └───┘ ───────┘   ┌──────  ┌───┐ ───────┐                 »\n",
       "«q6_3: ────────╫──────────────────────┤ If-0  ─┤ X ├  End-0 ├─────────────────»\n",
       "«              ║                      └──╥───  └───┘ ───────┘   ┌──────  ┌───┐»\n",
       "«q6_4: ────────╫─────────────────────────╫──────────────────────┤ If-0  ─┤ X ├»\n",
       "«      ┌─┐     ║                         ║                      └──╥───  └───┘»\n",
       "«q6_5: ┤M├─────╫─────────────────────────╫─────────────────────────╫──────────»\n",
       "«      └╥┘     ║                         ║                         ║          »\n",
       "«q6_6: ─╫──────╫─────────────────────────╫─────────────────────────╫──────────»\n",
       "«       ║      ║                         ║                         ║          »\n",
       "«q6_7: ─╫──────╫─────────────────────────╫─────────────────────────╫──────────»\n",
       "«       ║ ┌────╨────┐               ┌────╨────┐               ┌────╨────┐     »\n",
       "«c: 12/═╩═╡ c_2=0x1 ╞═══════════════╡ c_3=0x1 ╞═══════════════╡ c_4=0x1 ╞═════»\n",
       "«       5 └─────────┘               └─────────┘               └─────────┘     »\n",
       "«                                                                          »\n",
       "«q6_0: ────────────────────────────────────────────────────────────────────»\n",
       "«                                                                          »\n",
       "«q6_1: ────────────────────────────────────────────────────────────────────»\n",
       "«                                          ┌────── ┌──────── ┌────────────┐»\n",
       "«q6_2: ────────────────────────────────────┤       ┤         ┤ Ry(1.4973) ├»\n",
       "«                                          │ If-0  │ Else-0  ├────────────┤»\n",
       "«q6_3: ────────────────────────────────────┤       ┤         ┤ Ry(1.8327) ├»\n",
       "«       ───────┐                           └──╥─── └──────── └────────────┘»\n",
       "«q6_4:   End-0 ├──────────────────────────────╫────────────────────────────»\n",
       "«       ───────┘   ┌──────  ┌───┐ ───────┐    ║                            »\n",
       "«q6_5: ────────────┤ If-0  ─┤ X ├  End-0 ├────╫────────────────────────────»\n",
       "«                  └──╥───  └───┘ ───────┘    ║                            »\n",
       "«q6_6: ───────────────╫───────────────────────╫────────────────────────────»\n",
       "«                     ║                       ║                            »\n",
       "«q6_7: ───────────────╫───────────────────────╫────────────────────────────»\n",
       "«                ┌────╨────┐               ┌──╨──┐                         »\n",
       "«c: 12/══════════╡ c_5=0x1 ╞═══════════════╡ 0x0 ╞═════════════════════════»\n",
       "«                └─────────┘               └─────┘                         »\n",
       "«                                                                     »\n",
       "«q6_0: ───────────────────────────────────────────────────────────────»\n",
       "«                                                                     »\n",
       "«q6_1: ───────────────────────────────────────────────────────────────»\n",
       "«                     ───────┐ ┌─┐                                    »\n",
       "«q6_2: ──────■───────        ├─┤M├────────────────────────────────────»\n",
       "«      ┌─────┴──────┐  End-0 │ └╥┘┌─┐                                 »\n",
       "«q6_3: ┤ Ry(2.8529) ├        ├──╫─┤M├─────────────────────────────────»\n",
       "«      └────────────┘ ───────┘  ║ └╥┘┌────── ┌────────                »\n",
       "«q6_4: ─────────────────────────╫──╫─┤       ┤         ───────────────»\n",
       "«                               ║  ║ │       │          ┌────────────┐»\n",
       "«q6_5: ─────────────────────────╫──╫─┤       ┤         ─┤ Ry(2.3654) ├»\n",
       "«                               ║  ║ │ If-0  │ Else-0   └────────────┘»\n",
       "«q6_6: ─────────────────────────╫──╫─┤       ┤         ───────────────»\n",
       "«                               ║  ║ │       │         ┌─────────────┐»\n",
       "«q6_7: ─────────────────────────╫──╫─┤       ┤         ┤ Ry(0.77623) ├»\n",
       "«                               ║  ║ └──╥─── └──────── └─────────────┘»\n",
       "«                               ║  ║ ┌──╨──┐                          »\n",
       "«c: 12/═════════════════════════╩══╩═╡ 0x0 ╞══════════════════════════»\n",
       "«                               6  7 └─────┘                          »\n",
       "«                                                                         »\n",
       "«q6_0: ───────────────────────────────────────────────────────────────────»\n",
       "«                                                                         »\n",
       "«q6_1: ───────────────────────────────────────────────────────────────────»\n",
       "«                                                                         »\n",
       "«q6_2: ───────────────────────────────────────────────────────────────────»\n",
       "«                                                                         »\n",
       "«q6_3: ───────────────────────────────────────────────────────────────────»\n",
       "«       ┌────────────┐              ┌─┐                                   »\n",
       "«q6_4: ─┤ Ry(1.1872) ├──────■───────┤M├───────────────────────────────────»\n",
       "«       └─────┬──────┘┌─────┴──────┐└╥┘┌─┐                                »\n",
       "«q6_5: ───────■───────┤ Ry(2.5421) ├─╫─┤M├────────────────────────────────»\n",
       "«      ┌─────────────┐└────────────┘ ║ └╥┘┌─┐                             »\n",
       "«q6_6: ┤ Ry(0.39349) ├──────■────────╫──╫─┤M├─────────────────────────────»\n",
       "«      └──────┬──────┘┌─────┴──────┐ ║  ║ └╥┘┌─┐┌────── ┌───┐┌─┐ ───────┐ »\n",
       "«q6_7: ───────■───────┤ Ry(2.9998) ├─╫──╫──╫─┤M├┤ If-1  ┤ X ├┤M├  End-1 ├─»\n",
       "«                     └────────────┘ ║  ║  ║ └╥┘└──╥─── └───┘└╥┘ ───────┘ »\n",
       "«                                    ║  ║  ║  ║ ┌──╨──┐       ║           »\n",
       "«c: 12/══════════════════════════════╩══╩══╩══╩═╡ 0x0 ╞═══════╩═══════════»\n",
       "«                                    8  9  10 11└─────┘       11          »\n",
       "«                \n",
       "«q6_0: ──────────\n",
       "«                \n",
       "«q6_1: ──────────\n",
       "«                \n",
       "«q6_2: ──────────\n",
       "«                \n",
       "«q6_3: ──────────\n",
       "«       ───────┐ \n",
       "«q6_4:         ├─\n",
       "«              │ \n",
       "«q6_5:         ├─\n",
       "«        End-0 │ \n",
       "«q6_6:         ├─\n",
       "«              │ \n",
       "«q6_7:         ├─\n",
       "«       ───────┘ \n",
       "«c: 12/══════════\n",
       "«                </pre>"
      ],
      "text/plain": [
       "      ┌────────────┐                                       ┌─┐                 »\n",
       "q6_0: ┤ Ry(2.6528) ├──■───────────────────────■────────────┤M├─────────────────»\n",
       "      └───┬───┬────┘┌─┴─┐               ┌─────┴──────┐     └╥┘              ┌─┐»\n",
       "q6_1: ────┤ X ├─────┤ X ├───────■───────┤ Ry(2.3812) ├──■───╫───────────────┤M├»\n",
       "      ┌───┴───┴────┐└───┘┌──────┴──────┐└────────────┘┌─┴─┐ ║               └╥┘»\n",
       "q6_2: ┤ Ry(1.3213) ├─────┤ Ry(0.81341) ├──────■───────┤ X ├─╫───────■────────╫─»\n",
       "      ├────────────┤     └─────────────┘    ┌─┴─┐     └───┘ ║ ┌─────┴──────┐ ║ »\n",
       "q6_3: ┤ Ry(1.6062) ├────────────────────────┤ X ├───────────╫─┤ Ry(1.2721) ├─╫─»\n",
       "      └────────────┘                        └───┘           ║ └────────────┘ ║ »\n",
       "q6_4: ──────────────────────────────────────────────────────╫────────────────╫─»\n",
       "                                                            ║                ║ »\n",
       "q6_5: ──────────────────────────────────────────────────────╫────────────────╫─»\n",
       "                                                            ║                ║ »\n",
       "q6_6: ──────────────────────────────────────────────────────╫────────────────╫─»\n",
       "                                                            ║                ║ »\n",
       "q6_7: ──────────────────────────────────────────────────────╫────────────────╫─»\n",
       "                                                            ║                ║ »\n",
       "c: 12/══════════════════════════════════════════════════════╩════════════════╩═»\n",
       "                                                            0                1 »\n",
       "«                                                                             »\n",
       "«q6_0: ───────────────────────────────────────────────────────────────────────»\n",
       "«                                                                             »\n",
       "«q6_1: ───────────────────────────────────────────────────────────────────────»\n",
       "«      ┌─┐                                                                    »\n",
       "«q6_2: ┤M├────────────────────────────────────────────────────────────────────»\n",
       "«      └╥┘┌─┐                                                                 »\n",
       "«q6_3: ─╫─┤M├─────────────────────────────────────────────────────────────────»\n",
       "«       ║ └╥┘┌────── ┌──────── ┌────────────┐                     ───────┐ ┌─┐»\n",
       "«q6_4: ─╫──╫─┤       ┤         ┤ Ry(2.4624) ├──■─────────■───────        ├─┤M├»\n",
       "«       ║  ║ │ If-0  │ Else-0  └───┬───┬────┘┌─┴─┐┌──────┴──────┐  End-0 │ └╥┘»\n",
       "«q6_5: ─╫──╫─┤       ┤         ────┤ X ├─────┤ X ├┤ Ry(0.95289) ├        ├──╫─»\n",
       "«       ║  ║ └──╥─── └────────     └───┘     └───┘└─────────────┘ ───────┘  ║ »\n",
       "«q6_6: ─╫──╫────╫───────────────────────────────────────────────────────────╫─»\n",
       "«       ║  ║    ║                                                           ║ »\n",
       "«q6_7: ─╫──╫────╫───────────────────────────────────────────────────────────╫─»\n",
       "«       ║  ║ ┌──╨──┐                                                        ║ »\n",
       "«c: 12/═╩══╩═╡ 0x0 ╞════════════════════════════════════════════════════════╩═»\n",
       "«       2  3 └─────┘                                                        4 »\n",
       "«                                                                             »\n",
       "«q6_0: ───────────────────────────────────────────────────────────────────────»\n",
       "«                                                                             »\n",
       "«q6_1: ───────────────────────────────────────────────────────────────────────»\n",
       "«           ┌──────  ┌───┐ ───────┐                                           »\n",
       "«q6_2: ─────┤ If-0  ─┤ X ├  End-0 ├───────────────────────────────────────────»\n",
       "«           └──╥───  └───┘ ───────┘   ┌──────  ┌───┐ ───────┐                 »\n",
       "«q6_3: ────────╫──────────────────────┤ If-0  ─┤ X ├  End-0 ├─────────────────»\n",
       "«              ║                      └──╥───  └───┘ ───────┘   ┌──────  ┌───┐»\n",
       "«q6_4: ────────╫─────────────────────────╫──────────────────────┤ If-0  ─┤ X ├»\n",
       "«      ┌─┐     ║                         ║                      └──╥───  └───┘»\n",
       "«q6_5: ┤M├─────╫─────────────────────────╫─────────────────────────╫──────────»\n",
       "«      └╥┘     ║                         ║                         ║          »\n",
       "«q6_6: ─╫──────╫─────────────────────────╫─────────────────────────╫──────────»\n",
       "«       ║      ║                         ║                         ║          »\n",
       "«q6_7: ─╫──────╫─────────────────────────╫─────────────────────────╫──────────»\n",
       "«       ║ ┌────╨────┐               ┌────╨────┐               ┌────╨────┐     »\n",
       "«c: 12/═╩═╡ c_2=0x1 ╞═══════════════╡ c_3=0x1 ╞═══════════════╡ c_4=0x1 ╞═════»\n",
       "«       5 └─────────┘               └─────────┘               └─────────┘     »\n",
       "«                                                                          »\n",
       "«q6_0: ────────────────────────────────────────────────────────────────────»\n",
       "«                                                                          »\n",
       "«q6_1: ────────────────────────────────────────────────────────────────────»\n",
       "«                                          ┌────── ┌──────── ┌────────────┐»\n",
       "«q6_2: ────────────────────────────────────┤       ┤         ┤ Ry(1.4973) ├»\n",
       "«                                          │ If-0  │ Else-0  ├────────────┤»\n",
       "«q6_3: ────────────────────────────────────┤       ┤         ┤ Ry(1.8327) ├»\n",
       "«       ───────┐                           └──╥─── └──────── └────────────┘»\n",
       "«q6_4:   End-0 ├──────────────────────────────╫────────────────────────────»\n",
       "«       ───────┘   ┌──────  ┌───┐ ───────┐    ║                            »\n",
       "«q6_5: ────────────┤ If-0  ─┤ X ├  End-0 ├────╫────────────────────────────»\n",
       "«                  └──╥───  └───┘ ───────┘    ║                            »\n",
       "«q6_6: ───────────────╫───────────────────────╫────────────────────────────»\n",
       "«                     ║                       ║                            »\n",
       "«q6_7: ───────────────╫───────────────────────╫────────────────────────────»\n",
       "«                ┌────╨────┐               ┌──╨──┐                         »\n",
       "«c: 12/══════════╡ c_5=0x1 ╞═══════════════╡ 0x0 ╞═════════════════════════»\n",
       "«                └─────────┘               └─────┘                         »\n",
       "«                                                                     »\n",
       "«q6_0: ───────────────────────────────────────────────────────────────»\n",
       "«                                                                     »\n",
       "«q6_1: ───────────────────────────────────────────────────────────────»\n",
       "«                     ───────┐ ┌─┐                                    »\n",
       "«q6_2: ──────■───────        ├─┤M├────────────────────────────────────»\n",
       "«      ┌─────┴──────┐  End-0 │ └╥┘┌─┐                                 »\n",
       "«q6_3: ┤ Ry(2.8529) ├        ├──╫─┤M├─────────────────────────────────»\n",
       "«      └────────────┘ ───────┘  ║ └╥┘┌────── ┌────────                »\n",
       "«q6_4: ─────────────────────────╫──╫─┤       ┤         ───────────────»\n",
       "«                               ║  ║ │       │          ┌────────────┐»\n",
       "«q6_5: ─────────────────────────╫──╫─┤       ┤         ─┤ Ry(2.3654) ├»\n",
       "«                               ║  ║ │ If-0  │ Else-0   └────────────┘»\n",
       "«q6_6: ─────────────────────────╫──╫─┤       ┤         ───────────────»\n",
       "«                               ║  ║ │       │         ┌─────────────┐»\n",
       "«q6_7: ─────────────────────────╫──╫─┤       ┤         ┤ Ry(0.77623) ├»\n",
       "«                               ║  ║ └──╥─── └──────── └─────────────┘»\n",
       "«                               ║  ║ ┌──╨──┐                          »\n",
       "«c: 12/═════════════════════════╩══╩═╡ 0x0 ╞══════════════════════════»\n",
       "«                               6  7 └─────┘                          »\n",
       "«                                                                         »\n",
       "«q6_0: ───────────────────────────────────────────────────────────────────»\n",
       "«                                                                         »\n",
       "«q6_1: ───────────────────────────────────────────────────────────────────»\n",
       "«                                                                         »\n",
       "«q6_2: ───────────────────────────────────────────────────────────────────»\n",
       "«                                                                         »\n",
       "«q6_3: ───────────────────────────────────────────────────────────────────»\n",
       "«       ┌────────────┐              ┌─┐                                   »\n",
       "«q6_4: ─┤ Ry(1.1872) ├──────■───────┤M├───────────────────────────────────»\n",
       "«       └─────┬──────┘┌─────┴──────┐└╥┘┌─┐                                »\n",
       "«q6_5: ───────■───────┤ Ry(2.5421) ├─╫─┤M├────────────────────────────────»\n",
       "«      ┌─────────────┐└────────────┘ ║ └╥┘┌─┐                             »\n",
       "«q6_6: ┤ Ry(0.39349) ├──────■────────╫──╫─┤M├─────────────────────────────»\n",
       "«      └──────┬──────┘┌─────┴──────┐ ║  ║ └╥┘┌─┐┌────── ┌───┐┌─┐ ───────┐ »\n",
       "«q6_7: ───────■───────┤ Ry(2.9998) ├─╫──╫──╫─┤M├┤ If-1  ┤ X ├┤M├  End-1 ├─»\n",
       "«                     └────────────┘ ║  ║  ║ └╥┘└──╥─── └───┘└╥┘ ───────┘ »\n",
       "«                                    ║  ║  ║  ║ ┌──╨──┐       ║           »\n",
       "«c: 12/══════════════════════════════╩══╩══╩══╩═╡ 0x0 ╞═══════╩═══════════»\n",
       "«                                    8  9  10 11└─────┘       11          »\n",
       "«                \n",
       "«q6_0: ──────────\n",
       "«                \n",
       "«q6_1: ──────────\n",
       "«                \n",
       "«q6_2: ──────────\n",
       "«                \n",
       "«q6_3: ──────────\n",
       "«       ───────┐ \n",
       "«q6_4:         ├─\n",
       "«              │ \n",
       "«q6_5:         ├─\n",
       "«        End-0 │ \n",
       "«q6_6:         ├─\n",
       "«              │ \n",
       "«q6_7:         ├─\n",
       "«       ───────┘ \n",
       "«c: 12/══════════\n",
       "«                "
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import sys\n",
    "sys.path.append(\"../\")\n",
    "from qmg.generator import MoleculeGenerator\n",
    "from qmg.utils import ConditionalWeightsGenerator\n",
    "from rdkit import RDLogger\n",
    "RDLogger.DisableLog('rdApp.*')\n",
    "\n",
    "# parameter settings for epoxide derivatives\n",
    "num_heavy_atom = 3\n",
    "num_sample = 10000\n",
    "\n",
    "mg = MoleculeGenerator(num_heavy_atom)\n",
    "smiles_dict, validity, diversity = mg.sample_molecule(num_sample)\n",
    "mg.qc.draw(\"text\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# import sys\n",
    "# sys.path.append(\"../\")\n",
    "# from qmg.generator import MoleculeGenerator\n",
    "# from qmg.utils import ConditionalWeightsGenerator\n",
    "# from rdkit import RDLogger\n",
    "# RDLogger.DisableLog('rdApp.*')\n",
    "# import multiprocessing\n",
    "\n",
    "# # Parameter settings for epoxide derivatives\n",
    "# num_heavy_atom = 7\n",
    "# smarts = \"[O:1]1[C:2][C:3]1\"\n",
    "# disable_connectivity_position = [1]\n",
    "# num_sample = 10000\n",
    "\n",
    "# # Function to run sample_molecule for a given random_seed\n",
    "# def run_sample_molecule(args):\n",
    "#     random_seed, index = args\n",
    "#     cwg = ConditionalWeightsGenerator(\n",
    "#         num_heavy_atom,\n",
    "#         smarts=smarts,\n",
    "#         disable_connectivity_position=disable_connectivity_position\n",
    "#     )\n",
    "#     random_weight_vector = cwg.generate_conditional_random_weights(random_seed)\n",
    "#     mg = MoleculeGenerator(num_heavy_atom, all_weight_vector=random_weight_vector)\n",
    "#     smiles_dict, validity, diversity = mg.sample_molecule(num_sample)\n",
    "    \n",
    "#     # Print results for each process\n",
    "#     print(f\"\\nProcess {index}:\")\n",
    "#     print(f\"Random Seed: {random_seed}\")\n",
    "#     print(smiles_dict)\n",
    "#     print(\"Validity: {:.2f}%\".format(validity * 100))\n",
    "#     print(\"Diversity: {:.2f}%\".format(diversity * 100))\n",
    "    \n",
    "#     return smiles_dict, validity, diversity\n",
    "\n",
    "\n",
    "# # Get the number of processes from the user\n",
    "# n = 10\n",
    "\n",
    "# # Collect random seeds from the user\n",
    "# random_seeds = []\n",
    "# for i in range(n):\n",
    "#     seed = i\n",
    "#     random_seeds.append((seed, i + 1))  # Tuple of (random_seed, index)\n",
    "\n",
    "# # Use multiprocessing to run sample_molecule in parallel\n",
    "# with multiprocessing.Pool(processes=n) as pool:\n",
    "#     results = pool.map(run_sample_molecule, random_seeds)\n",
    "\n",
    "# # Optionally, process the collected results\n",
    "# for i, result in enumerate(results):\n",
    "#     smiles_dict, validity, diversity = result\n",
    "#     print(f\"\\nSummary for Random Seed {random_seeds[i][0]}:\")\n",
    "#     print(smiles_dict)\n",
    "#     print(\"Validity: {:.2f}%\".format(validity * 100))\n",
    "#     print(\"Diversity: {:.2f}%\".format(diversity * 100))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'NO': 915, None: 695, 'CC': 1659, 'O': 288, 'CN': 886, 'C': 3427, 'NCNCN': 51, 'CNNNN': 1, 'N[C@H]1CCN1': 37, 'N': 50, 'CNCNN': 32, 'CCCNC': 30, 'CCCN': 89, 'CCN(N)N': 3, 'C[C@@H]1CC=N1': 12, 'NNCNO': 19, 'C1CNNC1': 2, 'CC[C@@H](N)N': 151, 'C=C[C@@H](N)N': 9, 'CO': 236, 'CN[C@@H](N)N': 84, 'CCCNN': 83, 'NCNON': 48, 'C=C(N)NC': 12, 'C1=NCC1': 7, 'CCC#N': 3, 'C[C@H]1NON1': 1, 'CNCCO': 7, 'CCCCN': 30, 'C1NON1': 7, 'CNOOC': 1, 'C#N': 4, 'C1CON1': 1, 'N[C@@]1(N)CN1': 3, 'N[C@H]1CC1': 3, 'CONCN': 20, 'C=CCCN': 9, 'COCCN': 7, 'N=C1NCN1': 6, 'C#C': 10, 'N=C(N)NN': 1, 'CCCO': 2, 'N=CNCN': 22, 'N=CCCN': 40, 'CNONN': 23, 'CNCN': 48, 'C=C': 7, 'N=C1CCN1': 5, 'CN[C@H](C)N': 37, 'C1CNC1': 15, 'NCCCN': 93, 'C=CNCN': 5, 'CCONN': 2, 'C1=CC1': 1, 'C[C@@H]1CCN1': 25, 'CC[C@@H](C)N': 62, 'CNON': 24, 'NN[C@H]1CN1': 2, 'CCC(=N)N': 67, 'CC/C=N\\\\N': 4, 'CC[C@H]1CN1': 3, 'C=C(N)CC': 20, 'C=C1CCN1': 7, 'C[C@H]1N=C1N': 1, 'OO': 49, 'N[C@H]1CC=N1': 11, 'N[C@@H]1N=CN1': 11, 'COOC#N': 1, 'C1CNCN1': 2, 'CCC(C)=N': 3, 'C1=NCN1': 2, 'N[C@H]1NCN1': 19, 'C[C@]1(N)CN1': 2, 'C#CNCN': 1, 'CO[C@@H](N)N': 6, 'C/C=C\\\\NN': 3, 'NCNO': 10, 'CCC#CN': 1, 'CC[C@@H]1N=N1': 6, 'C=NCCC': 1, 'CN/C=N\\\\N': 5, 'CC[C@@H]1NN1': 2, 'NCCON': 8, 'N=C1N=CN1': 1, 'C1CCNC1': 2, 'NN': 14, 'NCn1[nH]o1': 1, 'CNCNO': 6, 'N/C=N/CN': 1, 'C[C@H]1NCN1': 9, 'NCOON': 3, 'CCNCN': 15, 'CN1CCC1': 5, 'CONC=N': 6, 'NN1CCO1': 2, 'CNC#N': 1, 'C=CC(=N)N': 2, 'CNCNC': 13, 'CN[C@H]1CC1': 2, 'CN[C@@H]1N=N1': 1, 'NN1CCC1': 14, 'COONN': 1, 'NNCCO': 3, 'C=CCC#N': 1, 'CN[C@@H]1NN1': 2, 'CNO': 3, 'N[C@@H]1NO1': 1, 'NN[C@@H]1NO1': 1, 'C[C@@H]1N=CN1': 2, 'CNC1=NN1': 2, 'N/C=N\\\\CN': 1, 'CN1NCN1': 1, 'CC/C=N\\\\C': 2, 'CO[C@@H](C)N': 1, 'N[C@@]1(N)CC1': 11, 'C1CN=NC1': 2, 'N#CNCN': 4, 'CNC(=N)N': 20, 'C1NCN1': 5, 'C[C@@H](N)CN': 1, 'NCCO': 4, 'CCNC=N': 1, 'C=C(N)OC': 1, 'N[C@]12N[C@@H]1N2': 1, 'CNC': 2, 'NCON': 1, 'CN1N=C1N': 1, 'N#CNON': 2, 'CCON': 7, 'CCONC': 1, 'C/N=C(\\\\C)N': 1, 'N=CCON': 1, 'N=C(N)NO': 1, 'NCOCN': 2, 'C[C@]1(N)CC1': 5, 'C[C@@H]1C#CN1': 1, 'CCNNN': 1, 'Cn1nc[nH]1': 1, 'C1CNN=N1': 1, 'C=C1N=CN1': 3, 'N[C@@H]1CCN1': 1, 'C1C2=N[C@H]12': 1, 'ON1CCC1': 1, 'C1N[C@H]2N[C@H]12': 1, 'N[C@@H](N)CO': 2, 'C#CONN': 1, 'C[C@@H](C)NN': 1, 'CNCN=N': 1, 'C=NON': 1, 'N[C@@H]1C[C@@H]1N': 4, 'C1=NOC1': 1, 'COCN': 1, 'NC1=NCC1': 2, 'CNONC': 12, 'C1NC2=N[C@H]12': 1, 'CN(C)CN': 1, 'CN1CCO1': 1, 'c1no[nH]1': 1, 'COOCN': 1, 'NC[C@@H]1CN1': 2, 'NNC1=CC1': 2, 'C=NCNC': 1, 'NONCO': 1, 'N#CCCN': 11, 'N/C=C/CN': 2, 'N/N=C\\\\NO': 1, 'NN1CNO1': 5, 'N[C@@]12C[C@H]1N2': 1, 'CNN(N)N': 2, 'CC1=NCC1': 1, 'C[C@H](N)CN': 1, 'C/N=C\\\\N': 1, 'N=CNO': 1, 'N#CNO': 2, 'N[C@H]1C=CN1': 2, 'NN1COO1': 1, 'NCOO': 2, 'C1=NNCC1': 1, 'CN1CNO1': 5, 'C=C1NCN1': 1, 'NNC1=CN1': 1, 'N=C[C@@H]1CN1': 1, 'C#C[C@@H](C)N': 1, 'N#COCN': 1, 'NN1CNC1': 5, 'N#CCON': 2, 'N#C/C=C\\\\N': 1, 'CN[C@H]1CN1': 1, 'NN1NCN1': 1, 'C1C2=N[C@@H]1N2': 1, 'CC/C=C\\\\N': 1, 'C/N=C\\\\NN': 1, 'C=N': 1, 'CCNC#N': 1, 'C=C[C@@H](C)N': 4, 'CCC': 2, 'N#CCC=N': 1, 'N[C@@H]1N[C@H]1N': 2, 'CCCCC': 2, 'NCCNN': 1, 'N=C(N)CN': 1, 'CCCN=N': 1, 'N=CNON': 1, 'C1N[C@@H]2N[N@]12': 1, 'N=C1CC1=N': 1, 'C[C@@](C)(N)N': 1, 'CN(N)ON': 1, 'C=NONN': 1, 'C[C@@H](C)CN': 1, 'N=O': 3, 'CN1CNC1': 2, 'CCC=N': 2, 'C=N[C@@H](N)N': 2, 'CCC1=CN1': 1, 'C=NO': 1, 'C=CCN': 1, 'CNC=N': 2, 'C/N=C\\\\NC': 1, 'N[C@@H]1CC=N1': 1, 'C#CCCN': 2, 'N=C1CC1': 1, 'N[C@H]1NON1': 1, 'C=C/C=C\\\\N': 1, 'C1[C@@H]2NN[C@H]12': 1, 'NC[C@H]1NO1': 1, 'N[C@]12CC1=N2': 1, 'C=CC(=C)N': 1, 'N=CC#CN': 1, 'CCCC=N': 2, 'C1C2=N[C@@H]12': 1, 'N=C1CC=N1': 1, 'Nn1nc[nH]1': 1, 'NCN1C=C1': 2, 'N/C=N\\\\O': 1, 'C1NNON1': 1, 'C[C@@H]1C=CN1': 1, 'N/C=N\\\\ON': 2, 'C[C@@]1(N)CN1': 1, 'N[C@@H]1NCO1': 1, 'C=C1CC=N1': 4, 'CNCOC': 1, 'C#CCC': 1, 'N#CCC#N': 1, 'CNN1C=N1': 1, 'C=C(O)CC': 1, 'N[C@H]1CON1': 1, 'N=CCC=N': 1, 'NNONO': 1, 'CC1=C(N)N1': 1, 'N/C=C\\\\CN': 1, 'C1C[N@@]2C[N@]12': 1, 'COCNN': 2, 'NC1=C(N)C1': 1, 'C[C@H]1N[C@H]1N': 1, 'C[N@@]1N[C@@H]1N': 1, 'C[C@]12N=C1N2': 1, 'C=C1C[C@H]1N': 1, 'CN[C@@H]1CN1': 1, 'CC#CCN': 1, 'N1O[C@@H]2N[C@H]12': 1, 'C/C(C)=C/N': 1, 'C=NONC': 1, 'CCCC#N': 1, 'C1=CCCN=1': 1, 'N=CNC=N': 1, 'N[C@H]1CN1': 1, 'CCNO': 1, 'NN1CCN1': 1, 'N=C/C=C\\\\N': 1, 'CCCON': 2, 'NN[C@H]1CC1': 1, 'CN[C@@H]1C=N1': 1, 'CC#CNN': 1, 'N[C@H]1CNN1': 1, 'CC[N+](=[N-])N': 1, 'N=CNNN': 1}\n",
      "Validity: 93.05%\n",
      "Diversity: 2.75%\n"
     ]
    }
   ],
   "source": [
    "import sys\n",
    "sys.path.append(\"../\")\n",
    "from qmg.generator import MoleculeGenerator\n",
    "from rdkit import RDLogger\n",
    "RDLogger.DisableLog('rdApp.*')\n",
    "\n",
    "# parameter settings\n",
    "num_heavy_atom = 5\n",
    "num_sample = 10000\n",
    "random_seed = 7\n",
    "\n",
    "mg = MoleculeGenerator(num_heavy_atom) \n",
    "smiles_dict, validity, diversity = mg.sample_molecule(num_sample, random_seed)\n",
    "print(smiles_dict)\n",
    "print(\"Validity: {:.2f}%\".format(validity*100))\n",
    "print(\"Diversity: {:.2f}%\".format(diversity*100))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'N=C=C(N)C(=O)CN': 1, None: 411, 'NCC(=O)CCNNO': 1, 'CC(=O)/C=C\\\\N(C)NN': 1, 'CC(=O)CCN(N)N=N': 1, 'NCC(=O)[C@H]1CNC1=O': 1, 'N/N=C/CC(=O)CC=O': 1, 'CC(=O)[C@H]1C=NN1NO': 1, 'NNN1CCC(=O)CN1': 1, 'CC(=O)[C@@H]1N[C@@H]1NNN': 1, 'CC(=O)[C@H](N)CNCO': 1, 'C[C@@H](N)C(=O)CN(N)O': 1, 'N[C@@H]1N=C=CC(=O)CO1': 1, 'C[C@@H]1CC(=O)CC=N1': 1, 'CN1CCC(=O)CC1=N': 1, 'C=C(CNN=N)C(C)=O': 1, 'CCC(=O)CCNCO': 1, 'CC(=O)CN=N': 2, 'CC(=O)/C=C\\\\NC(=N)N': 1, 'NN1C[C@H]2N[C@H]1CC2=O': 1, 'O=C1[C@H](CO)[C@H]2NN[C@@H]12': 1, 'CC(=O)C/C=N/C(C)=O': 1, 'CC(=O)CCN(C)C': 2, 'CC(=O)CCNNN': 1, 'CN1CC(=O)CCN1': 1, 'C[C@]1(N)CC(=O)[C@H]2C[N@]21': 1, 'CC(=O)/C(N)=C/NN=O': 1, 'CC(=O)[C@H]1CN[C@@H](N)O1': 2, 'NNN1CCC(=O)CC1': 1, 'N=NCC(=O)C=C=NN': 1, 'N[N@@+]1([O-])CC(=O)CCN1': 2, 'CC(=O)CCN(N)NN': 1, 'O=C1C=C=NC1': 2, 'NCCC(=O)CN': 1, 'CCC(=O)/C=C\\\\N=N': 1, 'C[C@@H](NNO)C(=O)CN': 2, 'CC(=O)[C@@H](C)N(C)NO': 1, 'NC[C@@H](N)C(=O)CN=O': 1, 'CC(=O)CCNC(C)=O': 1, 'CC(=O)[C@@H](C)[N+](=[N-])CO': 1, 'NN1CC(=O)C=CN1': 1, 'O=C(CNO)C1=NN=C1': 1, 'CC(=O)[C@H](C)CNNO': 1, 'NN=C=CC(=O)CCO': 1, 'NN(C=O)C1=CC(=O)C1': 1, 'CC(=O)C=C=NC(N)=O': 1, 'CC(=O)[C@]1(N)C=NCO1': 1, 'CC(=O)CCN(C)CO': 2, 'CN(C)[C@H]1CC(=O)C1': 1, 'NNCCC(=O)CN=O': 1, 'CN/C=C\\\\C(=O)CNO': 1, 'CC(=O)[C@H]1CN(C)CO1': 1, 'N=C=CC(=O)CCNO': 1, 'NCCC(=O)C[C@@H](N)O': 2, 'NN[C@H]1CC(=O)CCN1': 1, 'N[N@+]1([O-])CC(=O)CCO1': 1, 'C=C(NCNO)C(C)=O': 1, 'NN/C=C1\\\\OCCC1=O': 1, 'NN1CC(=O)[C@H]2C[N@]21': 1, 'CCC(=O)CCNNO': 3, 'O=C1C[C@H](O)C1': 1, 'N=C=C(N)C(=O)CCO': 1, 'CC(=O)CCNCNO': 7, 'CC(=O)[C@H]1C[N@@]1NN': 1, 'NN1C=CC(=O)CC1=O': 1, 'CC(=O)C1=NN(NN)C1': 1, 'CC(=O)[C@H]1CN(C)N1O': 2, 'N=C=C(N)C(=O)CC=O': 1, 'NNN1CC(=O)CC=N1': 1, 'CC(=O)C=C=NNN': 1, 'C[C@]1(N)CC(=O)C=C=N1': 1, 'NN1CCC(=O)CN=N1': 1, 'N[N@]1[C@@H]2[C@H]3CO[C@]21C3=O': 1, 'CC(=O)/C=C\\\\N(C)NO': 6, 'CCC(=O)CN': 6, 'CC(=O)CCNC(=N)N': 1, 'CC(=O)/C(O)=C/N(C)N': 1, 'NC1=CNN=NCC1=O': 1, 'CC1=CNN(O)CC1=O': 1, 'CC(=O)CCN(N)CO': 7, 'NCC(=O)CCNCO': 2, 'N=CN1CCC(=O)C=N1': 1, 'CC(=O)/C(=C/NN)NO': 2, 'NC1=CC(=O)C1': 27, 'O=C1C=CN[C@@H](NO)C1': 2, 'CC(=O)CNN': 2, 'NN1C=CC(=O)CC1': 4, 'NN(N)CCC(=O)CO': 1, 'CC(=O)/C=C\\\\[N+](=[N-])NO': 1, 'CC(=O)/C=C\\\\N(C)N': 3, 'NN=C=CC(=O)CNO': 1, 'CC(=O)[C@H](N)/C=N/CO': 1, 'CC(=O)CCN(C)NO': 6, 'CC(=O)[C@H]1CN(N)CN1': 1, 'CCC(=O)[C@@H](C=N)CO': 1, 'N=C1CC(=O)C1': 8, 'O=C1CNn2cc1n2O': 1, 'CNC[C@@H](C=O)C(C)=O': 1, 'NN(NO)C1=CC(=O)C1': 2, 'CC(=O)[C@H]1CN(NO)N1': 2, 'NNC#CC(=O)CNO': 1, 'C=CC(=O)CN': 1, 'O=C1CCNN(O)C1': 1, 'CC(=O)CCNNO': 1, 'C/N=C/[C@@H](CO)C(C)=O': 1, 'C=C(N)C(=O)CC(N)=O': 1, 'CN1C=C(O)C(=O)CN1': 1, 'NN1C=CC(=O)C[C@@H]1O': 6, 'CC(=O)C1=CN1N': 1, 'CC(=O)[C@@]12CN(N)[C@H]1O2': 1, 'CC(=O)/C=C\\\\NCNO': 8, 'C/N=C/[C@H]1N=CCC1=O': 1, 'C=C(C(C)=O)N(N)N': 2, 'CC(=O)c1cn(C)[nH]1': 1, 'CC(=O)/C=C\\\\NCCN': 2, 'N=C[C@H]1CO[C@H](N)C1=O': 1, 'NN1[C@@H]2[C@@H]3C(=O)[C@@H]2O[C@@H]31': 1, 'O=C1C[N@@]2C[C@H]12': 1, 'CC(=O)/C=C\\\\N(N)NO': 4, 'CCC(=O)[C@H](O)CN=N': 1, 'O=C1C/C(=N/CNO)C1': 1, 'CC(=O)[C@H](N)CNC=O': 1, 'O=C(CNNO)C1=CN1': 1, 'CN=C=CC(=O)CC=O': 1, 'CC(C)=O': 7507, 'CN(NO)[C@H]1CC(=O)C1': 2, 'CC(=O)C1=CN1N(N)O': 1, 'NNCCC(=O)CNO': 3, 'N/C=C\\\\C(=O)CCCO': 1, 'N/N=C/CC(=O)CNO': 1, 'CCC(=O)C=C=NC': 1, 'CC(=O)[C@H]1CN1': 49, 'NNCCC(=O)CC=O': 1, 'CC(=O)CC=O': 1, 'NNN[C@H]1CC(=O)C1': 1, 'CC(=O)C1=NO1': 1, 'CC(=O)CCN[C@@H](N)N': 1, 'C=N/C=C\\\\C(=O)CC': 1, 'CC(=O)CCNCN': 4, 'CC(=O)/C=C\\\\[N+](=[N-])CO': 1, 'NN1CCC(=O)C[C@@H]1O': 2, 'N=CCC(=O)CCNN': 1, 'O=C1CN(O)[N@]2C[C@H]1N2': 1, 'CC(=O)CC#N': 27, 'NN1[C@@H]2CC(=O)[C@@H]2N1O': 1, 'O=C1C=CN(NO)CC1': 2, 'N[C@H]1CC(=O)C1': 40, 'CC(=O)[C@H]1C=N1': 18, 'CC(=O)CCNNCO': 1, 'CC(=O)/C=C\\\\N(N)N=O': 1, 'O=C1CCNC1': 10, 'CC(=O)[C@]1(O)CN(N)C1': 1, 'CC(=N)C(C)=O': 2, 'CCC(=O)C=N': 1, 'CC(=O)CCN(N)C=O': 4, 'CC(=O)C=C=NCN': 1, 'C[C@H]1N[C@H]2CC(=O)[C@@H]21': 1, 'CCNCCC(C)=O': 2, 'NC[C@H]1O[C@H](N)CC1=O': 1, 'O=C1C=CNC1': 3, 'N=CCC(=O)CN(N)N': 1, 'N[C@H]1CC(=O)[C@@H]1NNO': 1, 'CC(=O)[C@@H](C)N': 24, 'CC(=O)CCO': 11, 'CC(=O)/C=C\\\\N(N)CN': 3, 'C[C@@H](O)CC(=O)/C=C\\\\N': 3, 'CC(=O)CCN(C)N': 5, 'NN[C@H]1CC(=O)[C@@H]1N': 1, 'CC(=O)[C@H]1CN(N)N1O': 3, 'C[C@]1(C(=O)CO)N[N@@]1N': 1, 'CC(=O)[C@H](N)CNC=N': 1, 'CC(=O)CCN[C@@H](N)O': 9, 'CC(=O)C1=CN(N)NO1': 1, 'N/C=C\\\\C(=O)C[C@@H](N)O': 3, 'CC(=O)[C@H]1CN(N)NO1': 2, 'CN/C=C(\\\\NO)C(C)=O': 1, 'CC(=O)C(=C=NN)NO': 1, 'CC(=O)/C=C\\\\N(N)C=O': 3, 'NN1CCC(=O)CC1': 2, 'CCC(=O)CCNN': 4, 'CC(=O)CCN(N)C=N': 3, 'CC(=O)/C=C\\\\NCN': 2, 'NCCC(=O)CNN': 1, 'NN[C@H]1CC(=O)C=CN1': 1, 'CC(=O)CCN(C)NN': 2, 'CC(=O)CCNNNO': 2, 'CN[C@H](CC(C)=O)NO': 1, 'CC(=O)CCNN(N)N': 2, 'C=C(N)C(C)=O': 14, 'CC(=O)[C@H](N)CNN=O': 1, 'CCN/C=C\\\\C(C)=O': 1, 'CC(=O)[C@H]1C[N@@]1CNO': 2, 'CC(=O)/C=C\\\\NN(C)O': 1, 'CC(=O)CCN(N)NO': 7, 'CC(=O)CCNCOO': 1, 'CC(=O)/C=C\\\\N(N)CO': 6, 'CC(=O)C1=CN[C@@H](N)O1': 1, 'CC(=O)[C@@H]1CN(NO)C1': 2, 'NN1C=CC(=O)CN1O': 1, 'CC(=O)C#CN(C)N': 1, 'O=C1C=C=NN(NO)C1': 1, 'NNCCC(=O)CNN': 1, 'CC(=O)CCNC(N)=O': 3, 'CN(C)CCC(=O)CO': 1, 'NN/C=C1\\\\ONCC1=O': 1, 'O=C1CCN(NO)NC1': 1, 'CCC(=O)CN(C)NN': 1, 'CC(=O)C1=C=N1': 14, 'NN1C[C@H]2O[N@@]1CC2=O': 2, 'N=C=CC(=O)CN(N)O': 1, 'CC(=O)CCN(C)OO': 1, 'N=CCC(=O)C[C@@H](N)O': 1, 'CCC(=O)C1=NNC1': 1, 'CN[C@H](C)C(=O)CC=O': 1, 'CC(=O)/C=C\\\\N(C)CO': 1, 'NCCC(=O)CCN': 1, 'CC(=O)c1cn(C=O)[nH]1': 1, 'CC(=O)CCN': 633, 'CC(=O)CCNCCO': 2, 'CC(=O)C=C=NNNO': 1, 'CC(=O)C1=CN(N)[C@H]1O': 1, 'CC(=O)c1cn(NN)[nH]1': 1, 'CC(=O)[C@H]1CN(C)N1': 1, 'CCC(=O)c1c[nH][nH]1': 1, 'CCN/C=C(\\\\O)C(C)=O': 1, 'CC(=O)[C@H]1CO1': 2, 'CC(=O)/C=C\\\\N': 410, 'CC(=O)C=C=N': 95, 'CC(=O)c1cn(N=N)[nH]1': 1, 'CNC[C@@H](O)C(=O)CN': 1, 'N/N=C/CC(=O)CNN': 2, 'N[C@@H]1CCC1=O': 4, 'C=NCCC(=O)CCO': 1, 'O=C1CCN[C@@H](NO)C1': 1, 'CC(=O)/C=C\\\\N(O)N=O': 1, 'CCC(=O)C=C=NNO': 1, 'NN1CCC(=O)CN1O': 2, 'CN1CCC(=O)C[C@@H]1N': 1, 'CC(=O)C1=C[N+](=[N-])CO1': 1, 'CC(=O)C(N)=C=NNO': 1, 'C[C@@H](N)C(=O)CNCO': 1, 'NN1CCC(=O)[C@@H]2O[C@@H]21': 1, '[N-]=[N+]1C=C1C(=O)CN=O': 1, 'CC(=O)/C=C\\\\NCCO': 1, 'CC(=O)/C=C\\\\[N+](=[N-])N': 1, 'N/C=C\\\\C(=O)CCN': 2, 'CN(N)CCC(=O)CO': 1, 'CC(=O)[C@H]1C[N@@]1CCN': 1, 'CC(=O)CCN(C)C=N': 1, 'O=C1CC=NC1': 3, 'C#CC(=O)CCNNO': 1, 'CNNCCC(C)=O': 1, 'C[C@]12CC(=O)C(=C=N1)O2': 1, '[N-]=[N+](N)CC(=O)/C=C\\\\N': 1, 'NCCC(=O)CCNO': 1, 'CCC(=O)/C=C\\\\NNO': 2, 'N/C=C\\\\C(=O)CN': 1, 'CC(=O)[C@H]1CN(N)CO1': 1, 'N[C@@]1(O)CC(=O)C=CN1': 1, 'C[C@H]1NCC1=O': 1, 'C[C@H]1C(=O)C[C@@H]1NNN': 1, 'CC(=N)C(=O)CC(=N)N': 1, 'CC(=O)/C=C\\\\N[C@H](C)O': 1, 'CCC(C)=O': 5, 'CC(=O)c1cn(C)n1O': 2, 'N[C@H]1CC(=O)C=CN1': 2, 'CC(=O)C1=CN1': 32, 'O=C(CCO)[C@@H]1CNC1': 1, 'CC(=O)c1cn(CN)[nH]1': 1, 'CC(=O)[C@H]1CN(N)[C@H]1O': 1, 'N[C@@H]1C=NC(=O)CC1=O': 1, 'CC(=O)/C=C\\\\N(N)NN': 1, 'CC(=O)CC(=O)C=C=N': 1, 'O=C1C=NCC1': 1, 'CC(=O)[C@H]1CN(N)N1': 1, 'N[C@]12OCN=C1CC2=O': 1, 'CN/C=C(\\\\N)C(C)=O': 3, 'CC(=O)C1=NC1': 1, 'NNCC(=O)[C@@H]1CNC1': 1, 'N/C=C\\\\C(=O)CNN': 1, 'NN1CC(=O)[C@H](O)CN1': 1, 'CC(=O)C(N)=C=NCO': 1, 'CC(=O)[C@H]1CN(C=O)N1': 3, 'N=CC(=O)[C@@]1(O)CNN1': 1, 'O=C1C=CN[C@H]1NNO': 1, 'N=C1CC(=O)CCN1N': 1, 'N[C@@H]1CNN(O)CC1=O': 1, 'CC(=O)C#CN': 4, 'CC(=O)/C=C\\\\O': 4, 'CC(=O)CCN(C)C=O': 1, 'NCCC(=O)CC(N)=O': 1, 'CC(=O)[C@@H]1CN(CN)C1': 1, 'CC(=O)C=C=NNNN': 1, 'CC(=O)C1=CN1NN': 1, 'CNCCC(=O)[C@@H](N)O': 1, 'O=C1CCNC=C1NO': 1, 'N=CCC(=O)[C@H]1CNN1': 1, 'NN1CCC(=O)CC1=O': 1, 'CC(=O)CC[N+](=[N-])CO': 1, 'NCC(=O)[C@H]1CNN1O': 1, 'O=C1C=CNN(NO)C1': 1, 'CC(=O)[C@H](O)CNCO': 1, 'O=C1C[C@H]2N=C12': 1, 'CC(=O)c1cn(N)n1O': 1, 'N=NCCC(=O)CN=O': 1, 'CC(=O)[C@H](N)CN(C)N': 1, 'CC(=O)CC=N': 167, 'C=CC(=O)CN[C@@H](N)N': 1, 'O=C1C[C@H]2[C@H]1CN2NO': 1, 'CC(=O)CON': 3, 'O=C1CC[N@]2C[C@H]1N2': 1, 'CC(=O)CON(C)N=O': 1, 'O=C(CCO)[C@H]1CN=N1': 1, 'O=C1C[C@@H]2N[C@@H](NO)[C@@H]12': 1, '[N-]=[N+]1[C@@H](O)[C@H]2C(=O)C[C@@H]21': 1, 'CC(=O)C=C=O': 1, 'Cn1c2c(n1O)C(=O)C2': 1, 'O=C(CCCO)[C@H]1CN1': 1, 'NN(CO)C1=CC(=O)C1': 1, 'CC(=O)[C@H](CN)CNN': 1, 'CN1CCC(=O)CN1': 1, 'O=C1C[C@H](O)[N@]2C[C@H]1N2': 1, 'CCC(=O)/C(=C/N)NO': 2, 'CC(=O)CCN(N)N': 2, 'NNCCC(=O)CCO': 2, 'CC(=O)CCN[C@H](C)O': 1, 'CC(=O)[C@](C)(N)N(N)N': 1, 'CC(=O)C/C=N/CN': 1, 'CC(=O)[C@]12C[N@@](CO1)N2': 1, 'CC(=O)/C=C\\\\NNNO': 3, 'O=C1CCN(NO)CC1': 1, 'CCC(=O)[C@@H](CN)NO': 1, 'CC(=O)CCNN(N)O': 2, 'CC(=O)/C=C\\\\N(O)NO': 1, 'O=C1C[C@H]2N[C@@H]12': 4, 'CC(=O)/C=C\\\\NC(N)=O': 4, 'CC(=O)[C@](C)(O)N(C)N': 1, 'CN=C=CC(=O)CCO': 1, 'C[C@@H]1CNCCC1=O': 1, 'O=C1C=C=N[C@@H](NO)C1': 1, 'CC(=O)/C(O)=C/NNN': 1, 'NCCC(=O)CCNN': 1, 'O=C(C/C=N/O)CCO': 1, 'O=C1CC=N[C@@H](NO)C1': 1, 'CC(=O)C1=C=N[C@@H](N)O1': 1, 'N[C@@H]1NCCC(=O)CO1': 1, 'CCCC(=O)CNN': 1, 'O=CCC(=O)[C@H]1CN=N1': 1, 'C[C@@H](NN)C(=O)CNO': 1, 'CC(=O)c1cn(N=O)[nH]1': 1}\n",
      "Validity: 95.89%\n",
      "Diversity: 3.49%\n"
     ]
    }
   ],
   "source": [
    "import sys\n",
    "sys.path.append(\"../\")\n",
    "from qmg.generator import MoleculeGenerator\n",
    "from qmg.utils import ConditionalWeightsGenerator\n",
    "from rdkit import RDLogger\n",
    "RDLogger.DisableLog('rdApp.*')\n",
    "# parameter settings for ketone derivatives\n",
    "num_heavy_atom = 9\n",
    "random_seed = 2\n",
    "smarts = \"[C:1][C:2](=[O:3])[C:4]\"\n",
    "disable_connectivity_position = [2, 3]\n",
    "num_sample = 10000\n",
    "\n",
    "cwg = ConditionalWeightsGenerator(num_heavy_atom, smarts=smarts, disable_connectivity_position=disable_connectivity_position)\n",
    "random_weight_vector = cwg.generate_conditional_random_weights(random_seed)\n",
    "mg = MoleculeGenerator(num_heavy_atom, all_weight_vector=random_weight_vector) \n",
    "smiles_dict, validity, diversity = mg.sample_molecule(num_sample)\n",
    "print(smiles_dict)\n",
    "print(\"Validity: {:.2f}%\".format(validity*100))\n",
    "print(\"Diversity: {:.2f}%\".format(diversity*100))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import sys\n",
    "sys.path.append(\"../\")\n",
    "from qmg.generator import MoleculeGenerator\n",
    "from qmg.utils import ConditionalWeightsGenerator\n",
    "from rdkit import RDLogger\n",
    "RDLogger.DisableLog('rdApp.*')\n",
    "\n",
    "# parameter settings for epoxide derivatives\n",
    "num_heavy_atom = 5\n",
    "random_seed = 2\n",
    "smarts = \"[C:1]1[N:2][C:3]=[C:4][C:5]=1\"\n",
    "disable_connectivity_position = [2]\n",
    "num_sample = 10000\n",
    "\n",
    "cwg = ConditionalWeightsGenerator(num_heavy_atom, smarts=smarts, disable_connectivity_position=disable_connectivity_position)\n",
    "random_weight_vector = cwg.generate_conditional_random_weights(random_seed)\n",
    "mg = MoleculeGenerator(num_heavy_atom, all_weight_vector=random_weight_vector) \n",
    "\n",
    "# smiles_dict, validity, diversity = mg.sample_molecule(num_sample)\n",
    "# print(smiles_dict)\n",
    "# print(\"Validity: {:.2f}%\".format(validity*100))\n",
    "# print(\"Diversity: {:.2f}%\".format(diversity*100))"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "qmg",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
